var express = require('express'); // 框架
var utility = require('utility'); // 工具
var url = require('url'); // 链接

var eventproxy = require('eventproxy'); // 多进程
var async = require('async');

var superagent = require('superagent'); // 网页抓取
var cheerio = require('cheerio'); // 页面分析

var app = express();
var ep = new eventproxy();

var source_url = 'https://cnodejs.org/';

var fibonacci = function (n) {
  if ( typeof n !== 'number' ) throw new Error('n should be a Number');

  if ( n < 0 ) throw new Error('n should >= 0');
  if ( n > 10 ) throw new Error('n should <= 10');

  if ( n === 0 ) return 0;
  if ( n === 1 ) return 1;

  return fibonacci(n-1) + fibonacci(n-2);
};

app.get('/', function (req, res, next) {
  // var q = req.query.q;
  // var md5Value = utility.md5(q);
  // res.send(md5Value);

  // superagent.get(source_url)
  // .end(function (err, sres) {
  //   if ( err ) return next(err);

  //   var $ = cheerio.load(sres.text); // cheerio

  //   var items = [];

  //   $('#topic_list .topic_title').each(function (idx, element) {
  //     var $element = $(element);

  //     // items.push({
  //     //   title: $element.attr('title'),
  //     //   href: $element.attr('href')
  //     // });

  //     var href = url.resolve(source_url, $element.attr('href'));
  //     items.push(href);
  //   });

  //   ep.after('topic_html', items.length, function (topics) {
  //     topics = topics.map(function (topicPair) {
  //       var topicUrl = topicPair[0];
  //       var topicHtml = topicPair[1];
  //       var $ = cheerio.load(topicHtml);

  //       return ({
  //         title: $('.topic_full_title').text().trim(),
  //         href: topicUrl,
  //         comment1: $('.reply_content').eq(0).text().trim(),
  //       });
  //     });

  //     console.log('final:');
  //     console.log(topics);
  //   });

  //   items.forEach(function (item) {
  //     superagent.get(item)
  //       .end(function (err, res) {
  //         console.log('fetch ' + item + ' successful');

  //         ep.emit('topic_html', [item, res.text]);
  //       });
  //   });

  //   res.send(items);
  // });

  // var concurrencyCount = 0;
  // var fetchUrl = function (url, callback) {
  //   var delay = parseInt((Math.random() * 10000000) % 2000, 10);
  //   concurrencyCount++;
  //   console.log('现在的并发数是', concurrencyCount, '，正在抓取的是', url, '，耗时' + delay + '毫秒');

  //   setTimeout(function () {
  //     concurrencyCount--;
  //     callback(null, url + ' html content');
  //   }, delay);
  // };

  // var urls = [];
  // for ( var i = 0; i < 30; i++ ) {
  //   urls.push('http://datasource_' + i);
  // }

  // async.mapLimit(urls, 5, function (url, callback) {
  //   fetchUrl(url, callback);
  // }, function (err, result) {
  //   console.log('final:');
  //   console.log(result);
  // });
});
app.get('/fib', function (req, res) {
  var n = Number(req.query.n);

  try {
    res.send(String(fibonacci(n)));
  } catch (e) {
    res
      .status(500)
      .send(e.message);
  }
});
module.exports = app;

app.listen(3000, function (req, res) {
  console.log('app is running at port 3000');
});


// https://cnodejs.org/getstart
// DigitalOcean(https://www.digitalocean.com/)

// https://github.com/node-modules/utility

// https://github.com/expressjs/body-parser

// http://visionmedia.github.io/superagent/ http
// https://github.com/cheeriojs/cheerio html
// https://github.com/JacksonTian/eventproxy 并发
// https://github.com/caolan/async 并发

// http://mochajs.org/ // mochajs
// phantomjs mocha-phantomjs
// https://github.com/tj/should.js // should
// https://github.com/gotwarlost/istanbul // 覆盖率
// http://chaijs.com/ 全栈测试框架
// https://github.com/remy/nodemon 

// http://blog.csdn.net/haoel/article/details/2886
// npm install express --registry=https://registry.npm.taobao.org
